package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

const (
	MAXBUFFERSIZE = 4096 //默认缓冲区
	FILENAME      = "C:\\Users\\junma\\Desktop\\goland-workspace\\goland-study\\src\\go_code\\chapter09-file\\test.txt"
	FILENAME2     = "C:\\Users\\junma\\Desktop\\copy.txt"
)

//const (
//	O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
//	O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
//	O_RDWR   int = syscall.O_RDWR   // 读写模式打开文件
//	O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
//	O_CREATE int = syscall.O_CREAT  // 如果不存在将创建一个新文件
//	O_EXCL   int = syscall.O_EXCL   // 和O_CREATE配合使用，文件必须不存在
//	O_SYNC   int = syscall.O_SYNC   // 打开文件用于同步I/O
//	O_TRUNC  int = syscall.O_TRUNC  // 如果可能，打开时清空文件
//)

func main() {
	//copy file
	Copy(FILENAME, FILENAME2)
}

//copy file
func Copy(filePath1, filePath2 string) {
	//获取reader对象
	open, err := os.Open(filePath1)
	if err != nil {
		fmt.Println("读取文件失败，文件路径：", filePath1)
	}
	reader := bufio.NewReader(open)

	//获取writer对象
	file, err := os.OpenFile(filePath2, os.O_WRONLY|os.O_CREATE, 0)
	if err != nil {
		fmt.Println("创建文件或写文件失败")
	}
	writer := bufio.NewWriter(file)

	//调用io.包的copy方法
	_, err = io.Copy(writer, reader)
	if err != nil {
		fmt.Println("copy file false")
	}

	defer func(open *os.File) {
		err := open.Close()
		if err != nil {
			fmt.Println("关闭资源失败")
		}
	}(open)
	defer func(file *os.File) {
		err := file.Close()
		if err != nil {
			fmt.Println("关闭资源失败！")
		}
	}(file)
}
